import tkinter as tk
from tkinter import ttk
from openai import OpenAI

class TravelPlannerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("旅智行-智能旅游路线规划助手")
        
        # 初始化OpenAI客户端
        self.client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")
        
        # 创建输入区域
        self.create_input_area()
        
        # 创建结果显示区域
        self.create_result_area()
    
    def create_input_area(self):
        input_frame = ttk.LabelFrame(self.root, text="行程信息")
        input_frame.pack(padx=10, pady=10, fill="x")
        
        # 起点输入
        ttk.Label(input_frame, text="起点:").grid(row=0, column=0, sticky="w")
        self.start_point = ttk.Entry(input_frame)
        self.start_point.grid(row=0, column=1, padx=5, pady=5, sticky="ew")
        
        # 终点输入
        ttk.Label(input_frame, text="终点:").grid(row=1, column=0, sticky="w")
        self.end_point = ttk.Entry(input_frame)
        self.end_point.grid(row=1, column=1, padx=5, pady=5, sticky="ew")
        
        # 时间区间
        ttk.Label(input_frame, text="出发日期(可输入中文如'2024年5月1日'):").grid(row=2, column=0, sticky="w")
        self.start_date = ttk.Entry(input_frame)
        self.start_date.grid(row=2, column=1, padx=5, pady=5, sticky="ew")
        
        ttk.Label(input_frame, text="返回日期(可输入中文如'2024年5月7日'):").grid(row=3, column=0, sticky="w")
        self.end_date = ttk.Entry(input_frame)
        self.end_date.grid(row=3, column=1, padx=5, pady=5, sticky="ew")
        
        # 中途停留点
        ttk.Label(input_frame, text="中途停留点(可选):").grid(row=4, column=0, sticky="w")
        self.waypoints = tk.Text(input_frame, height=3, width=30)
        self.waypoints.grid(row=4, column=1, padx=5, pady=5, sticky="ew")
        
        # 备注信息
        ttk.Label(input_frame, text="备注/特殊需求(可选):").grid(row=5, column=0, sticky="w")
        self.notes = tk.Text(input_frame, height=3, width=30)
        self.notes.grid(row=5, column=1, padx=5, pady=5, sticky="ew")
        
        # 提交按钮
        submit_btn = ttk.Button(input_frame, text="生成路线", command=self.generate_route)
        submit_btn.grid(row=6, column=0, columnspan=2, pady=10)
    
    def create_result_area(self):
        result_frame = ttk.LabelFrame(self.root, text="推荐路线")
        result_frame.pack(padx=10, pady=10, fill="both", expand=True)
        
        self.result_text = tk.Text(result_frame, wrap="word")
        self.result_text.pack(fill="both", expand=True, padx=5, pady=5)
        
        # 添加滚动条
        scrollbar = ttk.Scrollbar(result_frame, orient="vertical", command=self.result_text.yview)
        scrollbar.pack(side="right", fill="y")
        self.result_text.config(yscrollcommand=scrollbar.set)
    
    def generate_route(self):
        # 获取用户输入
        start = self.start_point.get()
        end = self.end_point.get()
        
        # 处理中文日期格式
        def convert_chinese_date(date_str):
            if '年' in date_str and '月' in date_str and '日' in date_str:
                year = date_str.split('年')[0]
                month = date_str.split('年')[1].split('月')[0]
                day = date_str.split('月')[1].split('日')[0]
                return f"{year}-{month.zfill(2)}-{day.zfill(2)}"
            return date_str
            
        start_date = convert_chinese_date(self.start_date.get())
        end_date = convert_chinese_date(self.end_date.get())
        waypoints = self.waypoints.get("1.0", "end-1c")
        notes = self.notes.get("1.0", "end-1c")
        
        # 构造提示词
        prompt = f"""请帮我规划从{start}到{end}的旅游路线。
出发日期: {start_date}
返回日期: {end_date}
"""
        
        if notes.strip():
            prompt += f"备注: {notes}\n"
        
        if waypoints.strip():
            # 分析途径点和备注信息
            waypoints_list = waypoints.split('\n')
            for wp in waypoints_list:
                wp = wp.strip()
                if wp:
                    if '休息' in wp or '午休' in wp:
                        prompt += f"备注: 用户希望在{wp.split('在')[1].split('时')[0]}左右安排休息时间\n"
                    else:
                        prompt += f"途经点: {wp}\n"
        
        prompt += """请综合考虑以下因素:
1. 交通方式建议(优先考虑用户备注的特殊需求)
2. 餐厅推荐(考虑用餐时间和休息需求)
3. 住宿选择
4. 返程安排
5. 实时交通信息
6. 景点人流量预估
7. 用户指定的休息时间和地点

请用中文回答，给出详细的路线规划建议，特别注意处理用户的特殊需求备注。"""
        
        # 调用AI生成路线
        self.result_text.delete("1.0", "end")
        self.result_text.insert("end", "正在生成路线，请稍候...\n")
        self.root.update()
        
        # 使用流式API调用
        stream = self.client.chat.completions.create(
            model="local-model",
            messages=[
                {"role": "system", "content": "你是一个智能旅游路线规划助手，能够根据用户需求生成最优旅游路线。"},
                {"role": "user", "content": prompt}
            ],
            temperature=0.7,
            stream=True
        )
        
        # 清空结果框并准备接收流式内容
        self.result_text.delete("1.0", "end")
        full_response = ""
        
        # 逐块处理流式响应
        for chunk in stream:
            if chunk.choices[0].delta.content:
                content = chunk.choices[0].delta.content
                full_response += content
                self.result_text.insert("end", content)
                self.result_text.see("end")
                self.root.update()

if __name__ == "__main__":
    root = tk.Tk()
    app = TravelPlannerApp(root)
    root.mainloop()